import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from 'axios'

Vue.config.productionTip = false
Vue.use(ElementUI)

// 修改axios的默认JSON解析器，确保大整数不会丢失精度
axios.defaults.transformResponse = [
  function (data) {
    if (typeof data === 'string') {
      try {
        // 直接使用正则表达式预处理JSON字符串，确保大整数在解析前已经被处理为字符串
        // 识别格式为 "user_id":1234567890123456789 的模式，将数字转为字符串
        const preprocessed = data.replace(/"(user_id|id|_id)":\s*(\d{16,})/g, '"$1":"$2"');

        // 然后使用JSON.parse的第二个参数进行双重保障
        return JSON.parse(preprocessed, (key, value) => {
          // 如果是数值类型并且可能是ID字段，转为字符串
          if (typeof value === 'number' &&
            (key === 'user_id' || key === 'id' || key.endsWith('_id'))) {
            return String(value);
          }
          return value;
        });
      } catch (e) {
        console.error('解析JSON时出错:', e);
        return data;
      }
    }
    return data;
  }
];

// 移除直接设置baseURL，让请求通过Vue代理
// axios.defaults.baseURL = 'http://localhost:8080'

// 添加请求拦截器，在请求头中加token
axios.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.token = token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 添加响应拦截器，处理常见错误
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response) {
      // 服务器返回错误状态码
      if (error.response.status === 401) {
        // 未授权，清除token并跳转到登录页
        store.dispatch('logout')
        router.push('/login')
        Vue.prototype.$message.error('登录已过期，请重新登录')
      } else if (error.response.status === 403) {
        Vue.prototype.$message.error('无权限进行此操作')
      } else if (error.response.status === 500) {
        Vue.prototype.$message.error('服务器错误，请稍后再试')
      }
    } else if (error.request) {
      // 请求发送但没有收到响应
      Vue.prototype.$message.error('网络错误，请检查您的网络连接')
    } else {
      // 请求设置出错
      Vue.prototype.$message.error('请求错误: ' + error.message)
    }
    return Promise.reject(error)
  }
)

Vue.prototype.$http = axios

// 创建Vue实例前尝试恢复用户会话
const initApp = async () => {
  // 检查本地存储中是否有token
  const token = localStorage.getItem('token')
  const userId = localStorage.getItem('user_id')

  // 确保用户ID是字符串形式，以防万一
  if (userId && typeof userId !== 'string') {
    localStorage.setItem('user_id', String(userId));
  }

  // 创建Vue应用实例
  const app = new Vue({
    router,
    store,
    render: h => h(App)
  })

  // 当本地存储有token和userId时，尝试恢复会话
  if (token && userId) {
    try {
      // 尝试获取用户信息
      await store.dispatch('fetchUserInfo')
      console.log('成功恢复用户会话')
    } catch (error) {
      console.error('恢复会话失败:', error)
      // 恢复会话失败，清除token和用户ID (fetchUserInfo已经会调用logout)

      // 显示错误消息
      Vue.prototype.$message({
        message: '登录已过期，请重新登录',
        type: 'warning',
        duration: 3000
      })

      // 确保重定向到登录页面
      router.push('/login')
    }
  } else {
    // 如果没有token或userId，清除所有登录信息
    store.dispatch('logout')

    // 确保未登录用户访问根路径时重定向到登录页
    if (window.location.pathname === '/' || window.location.pathname === '/profile') {
      router.push('/login')
    }
  }

  // 挂载应用
  app.$mount('#app')
}

// 启动应用
initApp() 